package reflect;

import java.io.File;
import java.lang.reflect.Method;

/**
 * 实例化与当前类Test2在同一个包中的所有类
 * 思路:
 * 1:首先定位Test2的字节码文件所在的目录(main方法里第一行代码)
 * 2:通过该目录获取里面所有的.class文件
 * 3:由于字节码文件名与类名一致(JAVA语法要求)，因此可以通过文件名确定类名
 * 4:使用Class.forName()加载对应的类并实例化
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
        File dir = new File(Test2.class.getResource(".").toURI());
        File[] files = dir.listFiles(f -> f.getName().endsWith(".class"));
        for (File file : files) {
//            System.out.println(file.getName());
            String packName = Test2.class.getPackage().getName();
            String className = file.getName().substring(0, file.getName().length() - 6);
            System.out.println("正在实例化:"+className);
            Class cls = Class.forName(packName + "." + className);
            Object o = cls.newInstance();
            Method[] methods = cls.getDeclaredMethods();
            for (Method method : methods) {
                if (method.getParameterCount() == 0) {
                    method.setAccessible(true);
                    System.out.println("开始调用:" + method.getName() + "()方法");
                    method.invoke(o);
                    method.setAccessible(false);
                }
            }
        }
    }
}
